//
//  test.swift
//  Wanke
//
//  Created by BO ZHOU on 2020/10/16.
//

import UIKit

public extension Date {
    
    
    /** 转格式化日期 */
    func dateString(format: String = "HH:mm:ss.SSS") -> String {
        
        let dateformatter = DateFormatter()
        
        //自定义日期格式
        dateformatter.dateFormat = format
        
        return dateformatter.string(from: self)
    }
    
    /**
     * 把当前时间转化为字符串
     */
    func toString(format: String = "HH:mm:ss.SSS") -> String {

        return self.dateString(format: format)
    }
    
    
    /**
     * 从formatString获取date
     */
    static func dateFrom(format: String, formatString: String) -> Date {
        
        
        let dateformatter = DateFormatter()
        
        //自定义日期格式
        
        dateformatter.dateFormat = format
        
        return dateformatter.date(from: formatString)!
    }

    /**

     获取这个月有多少天

     */

    func getMonthHowManyDay() ->Int {

        //我们大致可以理解为：某个时间点所在的“小单元”，在“大单元”中的数量
        return Calendar.current.range(of: .day, in: .month, for: self)?.count ?? 0
    }

    

    // 获取日期是星期几
    // 0-6 分别表示 周一到周日
    func getDateWeekDay() ->Int {

        let dateFmt         = DateFormatter()

        dateFmt.dateFormat  = "yyyy-MM-dd HH:mm:ss"

        let interval        = Int(self.timeIntervalSince1970)

        let days            = Int(interval/86400)

        let weekday         = ((days + 4) % 7 + 7) % 7

        return weekday
    }

    /**
     * 获取今天是周几, 周一, 周二... 周日
     */
    func getDateWeekName() -> String {
        let weekIndex = getDateWeekDay()
        
        switch weekIndex {
        case 0:
            return "周一"
        case 1:
            return "周二"
        case 2:
            return "周三"
        case 3:
            return "周四"
        case 4:
            return "周五"
        case 5:
            return "周六"
        case 6:
            return "周日"
        default:
            return "未知"
        }
    }
    
    

    /**

     *  获取这个月第一天是星期几

     */

    func getMontFirstWeekDay() ->Int {

        //1.Sun. 2.Mon. 3.Thes. 4.Wed. 5.Thur. 6.Fri. 7.Sat.

        let calendar = Calendar.current

        //这里注意 swift要用[,]这样方式写
        var com = calendar.dateComponents([.year, .month, .day], from: self)

        //设置成第一天
        com.day = 1

        let date = calendar.date(from: com)

        //我们大致可以理解为：某个时间点所在的“小单元”，在“大单元”中的位置  ordinalityOfUnit

        
        let firstWeekDay = calendar.ordinality(of: .weekday, in: .weekOfMonth, for: date!) ?? 0

        return firstWeekDay - 1

    }

    

    /**

     *  获取当前Day

     */

    func day() -> Int? {

        let calendar = Calendar.current

        //这里注意 swift要用[,]这样方式写
        let com = calendar.dateComponents([.year, .month, .day], from: self)

        return com.day

    }

    

    /**

     *  获取当前Month

     */

    func month() -> Int? {

        let calendar = Calendar.current

        //这里注意 swift要用[,]这样方式写

        let com = calendar.dateComponents([.year, .month, .day], from: self)

        return com.month

    }

    

    /**

     *  获取当前Year

     */

    func year() -> Int? {
        let calendar = Calendar.current

        //这里注意 swift要用[,]这样方式写

        let com = calendar.dateComponents([.year, .month, .day], from: self)

        return com.year
    }
    
    /** 获取hour */
    func hour() -> Int? {
        
        let calendar = Calendar.current

        //这里注意 swift要用[,]这样方式写

        let com = calendar.dateComponents([.hour], from: self)

        return com.hour
    }
    
    /** 获取minute */
    func minute() -> Int? {
        
        let calendar = Calendar.current

        //这里注意 swift要用[,]这样方式写

        let com = calendar.dateComponents([.minute], from: self)

        return com.minute
    }

 

//    /**
//
//     获取指定时间下一个月的时间
//
//     */
//
//    func getNextDate() ->NSDate {
//
//        let calendar =NSCalendar.currentCalendar()
//
//        let com = calendar.components([.Year,.Month,.Day], fromDate:self)
//
//        com.month +=1
//
//        com.day =1
//
//        if com.month ==NSDate().getMonth() {
//
//            com.day =NSDate().getDay()
//
//        }
//
//        return calendar.dateFromComponents(com)!
//
//    }
//
//    
//
//    /**
//
//     获取指定时间上一个月的时间
//
//     */
//
//    func getLastDate() ->NSDate {
//
//        let calendar =NSCalendar.currentCalendar()
//
//        let com = calendar.components([.Year,.Month,.Day], fromDate:self)
//
//        com.month -=1
//
//        com.day =1
//
//        if com.month ==NSDate().getMonth() {
//
//            com.day =NSDate().getDay()
//
//        }
//
//        return calendar.dateFromComponents(com)!
//
//    }
//
//    
//
//    /**
//
//     获取指定时间下一个月的长度
//
//     */
//
//    func getNextDateLenght() ->Int {
//
//        let date =self.getNextDate()
//
//        return date.getMonthHowManyDay()
//
//    }
//
//    
//
//    /**
//
//     获取指定时间上一个月的长度
//
//     */
//
//    func getLastDateLenght() ->Int {
//
//        let date =self.getLastDate()
//
//        return date.getMonthHowManyDay()
//
//    }
//
//    
//
//    //当前时间label内容
//
//    func getTimeYYYY_MM() ->String {
//
//        let day        =getDay()
//
//        let month      =getMonth()
//
//        let year       =getYear()
//
//        let dateString =String("\(year)年\(month)月\(day)日")
//
//        return dateString
//
//    }
//
//    
//
//    /**
//
//     是否是今天
//
//     */
//
//    func isToday()->Bool {
//
//        let calendar =NSCalendar.currentCalendar()
//
//        /// 获取self的时间
//
//        let comSelf = calendar.components([.Year,.Month,.Day], fromDate:self)
//
//        /// 获取当前的时间
//
//        let comNow = calendar.components([.Year,.Month,.Day], fromDate:NSDate())
//
//        return comSelf.year==comNow.year && comSelf.month==comNow.month && comSelf.day==comNow.day
//
//    }
//
//    
//
//    /**
//
//     是否是这个月
//
//     */
//
//    func isEqualMonth(date :NSDate)->Bool {
//
//        let calendar =NSCalendar.currentCalendar()
//
//        /// 获取self的时间
//
//        let comSelf = calendar.components([.Year,.Month,.Day], fromDate:self)
//
//        /// 获取当前的时间
//
//        let comNow = calendar.components([.Year,.Month,.Day], fromDate: date)
//
//        return comSelf.year==comNow.year && comSelf.month==comNow.month
//
//    }
//
//    
//
//    /**
//
//     是否是这个月
//
//     */
//
//    func isThisMonth()->Bool {
//
//        let calendar =NSCalendar.currentCalendar()
//
//        /// 获取self的时间
//
//        let comSelf = calendar.components([.Year,.Month,.Day], fromDate:self)
//
//        /// 获取当前的时间
//
//        let comNow = calendar.components([.Year,.Month,.Day], fromDate:NSDate())
//
//        return comSelf.year==comNow.year && comSelf.month==comNow.month
//
//    }
//
//    
//
//    /**
//
//     分别获取准确的年月日
//
//     */
//
//    func getDateY_M_D(day :Int)->(year:Int,month:Int,day:Int) {
//
//        let calendar =NSCalendar.currentCalendar()
//
//        let comSelf = calendar.components([.Year,.Month,.Day], fromDate:self)
//
//        comSelf.day = day
//
//        return (comSelf.year,comSelf.month,comSelf.day)
//
//    }
//
//    
//
//    /**
//
//     获取指定date
//
//     */
//
//    func getDate(day :Int)-> NSDate {
//
//        let calendar =NSCalendar.currentCalendar()
//
//        let comSelf = calendar.components([.Year,.Month,.Day], fromDate:self)
//
//        comSelf.day = day
//
//        return calendar.dateFromComponents(comSelf)!
//
//    }
//
//    
//
//    /**
//
//     把当前时间转化为字符串
//
//    */
//
//    func currentDateIntoString()->String {
//
//        let dateFormatter        =NSDateFormatter()
//
//        dateFormatter.dateFormat ="yyyy-MM-dd HH:mm:ss"
//
//        let timeString           = dateFormatter.stringFromDate(self)
//
//        return timeString
//
//    }

}
